using System;
using System.Collections.Generic;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;
using UD.GRAL.Entity;

namespace UD.GRAL.DataAccess
{
    public class NivelAcademicoDAL : GeneralDAL
    {
        public NivelAcademicoDAL()
        {
        }
        public int InsertarNivelAcademico(NivelAcademico pNivelAcademico)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_NivelAcademico_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdNivelAcademico", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@CodNivelAcademico", DbType.String, pNivelAcademico.CodNivelAcademico);
                    vDataBase.AddInParameter(vDbCommand, "@NombreNivelAcademico", DbType.String, pNivelAcademico.NombreNivelAcademico);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pNivelAcademico.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pNivelAcademico.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pNivelAcademico.IdNivelAcademico = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdNivelAcademico").ToString());
                    GenerarLogAuditoria(pNivelAcademico, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarNivelAcademico(NivelAcademico pNivelAcademico)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_NivelAcademico_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdNivelAcademico", DbType.Int32, pNivelAcademico.IdNivelAcademico);
                    vDataBase.AddInParameter(vDbCommand, "@CodNivelAcademico", DbType.String, pNivelAcademico.CodNivelAcademico);
                    vDataBase.AddInParameter(vDbCommand, "@NombreNivelAcademico", DbType.String, pNivelAcademico.NombreNivelAcademico);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pNivelAcademico.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pNivelAcademico.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pNivelAcademico, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarNivelAcademico(NivelAcademico pNivelAcademico)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_NivelAcademico_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdNivelAcademico", DbType.Int32, pNivelAcademico.IdNivelAcademico);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pNivelAcademico, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public NivelAcademico ConsultarNivelAcademico(int pIdNivelAcademico)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_NivelAcademico_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdNivelAcademico", DbType.Int32, pIdNivelAcademico);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        NivelAcademico vNivelAcademico = new NivelAcademico();
                        while (vDataReaderResults.Read())
                        {
                            vNivelAcademico.IdNivelAcademico = vDataReaderResults["IdNivelAcademico"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdNivelAcademico"].ToString()) : vNivelAcademico.IdNivelAcademico;
                            vNivelAcademico.CodNivelAcademico = vDataReaderResults["CodNivelAcademico"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodNivelAcademico"].ToString()) : vNivelAcademico.CodNivelAcademico;
                            vNivelAcademico.NombreNivelAcademico = vDataReaderResults["NombreNivelAcademico"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreNivelAcademico"].ToString()) : vNivelAcademico.NombreNivelAcademico;
                            vNivelAcademico.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vNivelAcademico.Estado;
                            vNivelAcademico.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vNivelAcademico.UsuarioCrea;
                            vNivelAcademico.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vNivelAcademico.FechaCrea;
                            vNivelAcademico.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vNivelAcademico.UsuarioModifica;
                            vNivelAcademico.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vNivelAcademico.FechaModifica;
                        }
                        return vNivelAcademico;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<NivelAcademico> ConsultarNivelAcademicos(String pCodNivelAcademico, String pNombreNivelAcademico, Boolean? pEstado)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_NivelAcademicos_Consultar"))
                {
                    if(pCodNivelAcademico != null)
                         vDataBase.AddInParameter(vDbCommand, "@CodNivelAcademico", DbType.String, pCodNivelAcademico);
                    if(pNombreNivelAcademico != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreNivelAcademico", DbType.String, pNombreNivelAcademico);
                    if(pEstado != null)
                         vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pEstado);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<NivelAcademico> vListaNivelAcademico = new List<NivelAcademico>();
                        while (vDataReaderResults.Read())
                        {
                                NivelAcademico vNivelAcademico = new NivelAcademico();
                            vNivelAcademico.IdNivelAcademico = vDataReaderResults["IdNivelAcademico"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdNivelAcademico"].ToString()) : vNivelAcademico.IdNivelAcademico;
                            vNivelAcademico.CodNivelAcademico = vDataReaderResults["CodNivelAcademico"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodNivelAcademico"].ToString()) : vNivelAcademico.CodNivelAcademico;
                            vNivelAcademico.NombreNivelAcademico = vDataReaderResults["NombreNivelAcademico"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreNivelAcademico"].ToString()) : vNivelAcademico.NombreNivelAcademico;
                            vNivelAcademico.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vNivelAcademico.Estado;
                            vNivelAcademico.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vNivelAcademico.UsuarioCrea;
                            vNivelAcademico.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vNivelAcademico.FechaCrea;
                            vNivelAcademico.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vNivelAcademico.UsuarioModifica;
                            vNivelAcademico.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vNivelAcademico.FechaModifica;
                                vListaNivelAcademico.Add(vNivelAcademico);
                        }
                        return vListaNivelAcademico;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
